#include <WiFi.h>
#include <SPI.h>
#include <RDA5807.h>
#include <U8g2lib.h>
#include <Ticker.h>


//wifi info
char* ssid     = "iron2222";
char* password = "18436099009"; 

//web radio
String IPAddress;
uint16_t num=0;
#define WEBSERVERIP "192.168.43.212"
#define WEBSERVERPORT 80

uint8_t netbuf[3][1024];      //网络数据缓冲区
uint16_t writep = 0;          //写入数量
uint16_t readp = 0;           //读取数量
WiFiClient client; //声明一个客户端对象，用于与服务器进行连接
bool connstat = false;        //连接状态
bool iswaitecho = false;      //是否等待服务器回应
Ticker flipper;               //时间中断
uint16_t m_offset = 0;

void onTimer(void) {
  if(readp<=writep)  dacWrite(17, netbuf[readp % 3][m_offset++]);      //播放一次声音
  if (m_offset >= 1024) {
    m_offset = 0;
    readp++;      //读取完成一个缓冲区
  }
}
bool connNetMusic() {
  uint8_t i = 0;
  while (i < 5) { //最多连接5次
    if (client.connect(WEBSERVERIP, WEBSERVERPORT)) {
      connstat = true;
      Serial.println("连接成功");
      return true;
    } else {
      Serial.println("访问失败");
      client.stop(); //关闭客户端
    }
    i++;
    delay(100);
  }
  return false;
}

void playMusic() {
  
        if (connstat == true){

            if (iswaitecho == false && (writep - readp) < 2) {
                client.write('n');          //申请一个缓冲片
                iswaitecho = true;
            }
//            if(writep%120==0) displayMessage();        //降低刷新屏幕频率
            if (client.available()) { //如果有数据可读取
                num = client.read(netbuf[writep % 3], 1024);
                if (writep == 0 && readp == 0) {
                    flipper.attach(0, onTimer);     //开启定时中断 就是每秒中断20000次
                }
                writep++;
                iswaitecho = false;
            }
        }
        
}
//web end
U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 36, /* data=*/ 35, /* cs=*/ 46, /* dc=*/ 33, /* reset=*/ 34);

void setup() {
  
  pinMode(41, OUTPUT);
  pinMode(42, OUTPUT);

  digitalWrite(41, HIGH);
  digitalWrite(42, HIGH);
  
  u8g2.begin(); 
  Serial.begin(115200);

  dispwelcome();    //显示欢迎画面

  WiFi.begin(ssid, password);
  Serial.print("Connecting to ");              // 串口监视器输出网络连接信息
  Serial.print(ssid); Serial.println(" ...");  // 告知用户正在尝试WiFi连接
  int i = 0;                                   // 这一段程序语句用于检查WiFi是否连接成功
  while (WiFi.status() != WL_CONNECTED) {      // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。 
    delay(1000);                               // 如果WiFi连接成功则返回值为WL_CONNECTED                       
    Serial.print(i++); Serial.print(' ');      // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值
  }                                            // 同时NodeMCU将通过串口监视器输出连接时长读秒。
                                               // 这个读秒是通过变量i每隔一秒自加1来实现的。                                           
  Serial.println("");                          // WiFi连接成功后
  Serial.println("Connection established!");   // NodeMCU将通过串口监视器输出"连接成功"信息。
  Serial.print("IP address:    ");             // 同时还将输出NodeMCU的IP地址。这一功能是通过调用
  Serial.println(WiFi.localIP());              // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。
//  ipaddress = WiFi.localIP().toString();

  connNetMusic();
}

void loop() {
  playMusic();
  dispwelcome();
}

void dispwelcome() {
  u8g2.firstPage();
  u8g2.clearBuffer();         //清除内部缓冲区
  u8g2.setFontDirection(0);   //设置字体方向
  u8g2.setFont(u8g2_font_ncenB14_tr);     //设置字体
  u8g2.setCursor(0, 40);
  u8g2.print("Hello Jarvis!");
  u8g2.sendBuffer();
  delay(1000);
}
